/**
 * intramap 3d 테스트
 * 필요 함수 모음 
 * 2014.05.20
 * 이명환 
 */
/**
 * loadTerrain: itf 파일을 불러오는 함수
 * 전역 변수 세팅
 * layerName: layer 이름
 * pageType: 서비스 타입
 * layerURL: layer url
 * 호출
 * Init(): 초기 세팅 함수
 * layerComm(): layer 로드 콘트롤
 */
function loadTerrain() {//terrainLoad Load 함수
	serviseName = "terrain";
	var layerName = terrainLayer = document.getElementById('layerTName').value;		
	var layerURL = terrainURL = document.getElementById('terrainURL').value;
	
	
	if( terrainLoad ){//리로드 터레인
		if( confirm("리로드 하시겠습니까? \n약 3초의 시간이 걸립니다.") ){
			location.href("intraMap3D.jsp?name="+layerName+"&url="+layerURL);
		}else{
			location.href("intraMap3D.jsp");
		}
	}else{
		showTypeAdd(serviseName, layerName, true);
		
		intraMap3D.length = 0;	
		intraMap3D = [layerName, layerURL];

		layerComm();
	    zzz.CamFit();
	}	
    /*showTypeAdd(serviseName, layerName, true);
    
    intraMap3D.length = 0;	
    intraMap3D = [layerName, layerURL];
    
    layerComm();
    zzz.CamFit();*/

}

var returns = new Array();
var urlValue = window.location.href;

if( urlValue.indexOf("?") > -1 ){//? 찾기
	title="새롭게 지형 테이터(itf)올립니다.";
	var interval = setInterval(reloadTerrain, 3000);
}

function reloadTerrain(){//interval terrain reload
//	alert("a");
	var getParam = urlValue.substr(urlValue.indexOf("?")).toLowerCase();
	var parsedValue = getParam.split("&");
	for( var i=0; i< parsedValue.length; i++ ){//갯수만큼
		if( parsedValue[i].indexOf("=") > -1 ){
			var aParam = parsedValue[i].split("=");
			returns[i] = aParam[1];
		}
	}
	
	clearInterval(interval);

	serviseName = "terrain";
	var layerName = terrainLayer = returns[0];
	var layerURL = terrainURL = returns[1];

//	alert("Load:"+serviseName+","+layerName+","+layerURL);
	showTypeAdd(serviseName, layerName, true);
	
	intraMap3D.length = 0;	
	intraMap3D = [layerName, layerURL];

	layerComm();
    zzz.CamFit();
}

/**
 * loadGrid: grid 파일을 불러오는 함수
 * 전역 변수 세팅
 * layerName: layer 이름
 * pageType: 서비스 타입
 * layerURL: layer url
 * 호출
 * Init(): 초기 세팅 함수
 * layerComm(): layer 로드 콘트롤
 */
function loadGrid() {//grid Load 함수
	serviseName = "grid";
	var layerName = gridLayer = document.getElementById('layerGName').value;
	var layerURL = gridURL = document.getElementById('gridURL').value;	
	var maxdist = gridMaxdistInput = document.getElementById('maxdist').value;
	var rscPath = gridRscPathInput = document.getElementById('rscPath').value;

	if( 4000 < maxdist ){
		if( !confirm("가시거리 값이 너무 높으면 런타임 오류가 날 수 있습니다.") ){
			return 1;
		}
	}

	showTypeAdd(serviseName, layerName, true);
	
	intraMap3D.length = 0;	
	intraMap3D = [layerName, layerURL, maxdist, rscPath];
	layerComm();
}

/**
 * Shp 레이어 불러오기
 * 매게변수 
 * layerTTName: layerName
 * 변수 세팅
 * layerTName: terrain 용 페이어 명 및 :EnvDataSetName: 다운 받는 폴더 설정
 * textureURL
 * layerPolygonMode: Both, Polygon, Outline
 * 호출
 * Init();
 * LayerTerrain();
 * CamFit();
 */
function loadTexture() {//Shp 레이어 불러오기
	serviseName = "Texture";
	var layerName = document.getElementById('layerTTName').value;
	var layerURL = document.getElementById('textureURL').value;
	var polygonMode = document.getElementById('shpMode').value;	
	

	showTypeAdd(serviseName, layerName, true);
	
	intraMap3D.length = 0;	
	intraMap3D = [layerName, layerURL, polygonMode];

	layerComm();
}


function loadScene(){//3d 로딩
	serviseName = "scene";
	var layerName = document.getElementById('layerSName').value;
	var sceneURL = document.getElementById('sceneURL').value;
	var scenePosion = document.getElementById('scenePosion').value;	

	showTypeAdd(serviseName, layerName, true);
 	
	intraMap3D.length = 0;	
	intraMap3D = [layerName, sceneURL, scenePosion];

	layerComm();
}
/**
 * 3DS 레이어 불러오기
 * 매게변수 
 * layerTTName: layerName
 * 변수 세팅
 * layerTName: terrain 용 페이어 명 및 :EnvDataSetName: 다운 받는 폴더 설정
 * textureURL
 * layerPolygonMode: Both, Polygon, Outline
 * 호출
 * Init();
 * LayerTerrain();
 * CamFit();
 */
function geometryBuild() {//그리기 모드 build	
	serviseName = "build";
	numFloor = document.getElementById('buildNumFloor').value; //층수
	FloorHeight = document.getElementById('buildFloorHeight').value; //층간 높이
	tex = document.getElementById('buildTex').value;

	intraMap3D.length = 0;	
	intraMap3D = [numFloor, FloorHeight, tex];

	geometryComm();
}

/**
 * 3DS 레이어 불러오기
 * 매게변수 
 * layerTTName: layerName
 * 변수 세팅
 * layerTName: terrain 용 페이어 명 및 :EnvDataSetName: 다운 받는 폴더 설정
 * textureURL
 * layerPolygonMode: Both, Polygon, Outline
 * 호출
 * Init();
 * LayerTerrain();
 * CamFit();
 */
function geometryRoad(){//그리기 모드 road re=id+"^"+roadMatID+"^"+roadNumline+"^"+roadCenterline+"^"+roadWidth+"^"+roadTileheight+"^"+roadHeight;
	serviseName = "road";
	var roadMatID = document.getElementById('roadMatID').value;
	var roadNumline = document.getElementById('roadNumline').value;
	var roadCenterline = document.getElementById('roadCenterline').value;
	var roadWidth = document.getElementById('roadWidth').value;
	var roadTileheight = document.getElementById('roadTileheight').value;
	var roadHeight = document.getElementById('roadHeight').value;

	intraMap3D.length = 0;	
	intraMap3D = [roadMatID, roadNumline, roadCenterline, roadWidth, roadTileheight, roadHeight];

	geometryComm();
}

/**
 * 3DS 레이어 불러오기
 * 매게변수 
 * layerTTName: layerName
 * 변수 세팅
 * layerTName: terrain 용 페이어 명 및 :EnvDataSetName: 다운 받는 폴더 설정
 * textureURL
 * layerPolygonMode: Both, Polygon, Outline
 * 호출
 * Init();
 * LayerTerrain();
 * CamFit();
 */
function geometryGaro(){//그리기 모드 road
	serviseName = "garo";
	var garoLightx = document.getElementById('garoLightx').value;
	var garoLighty = document.getElementById('garoLighty').value;
	var garoLightz = document.getElementById('garoLightz').value;
	var garoTheta = document.getElementById('garoTheta').value;
	var garoModelpath = document.getElementById('garoModelpath').value;
	
	intraMap3D.length = 0;	
	intraMap3D = [garoLightx, garoLighty, garoLightz, garoTheta, garoModelpath];
	
	geometryComm();
}



/**
 * 3DS 레이어 불러오기
 * 매게변수 
 * layerTTName: layerName
 * 변수 세팅
 * layerTName: terrain 용 페이어 명 및 :EnvDataSetName: 다운 받는 폴더 설정
 * textureURL
 * layerPolygonMode: Both, Polygon, Outline
 * 호출
 * Init();
 * LayerTerrain();
 * CamFit();
 */
function geometryBrush(){
	serviseName = "brush";
	var brushAreaMode = document.getElementById('brushAreaMode').value;
	var brushAmount = document.getElementById('brushAmount').value;
	var brushRadius = document.getElementById('brushRadius').value;

	intraMap3D.length = 0;	
	intraMap3D = [brushAreaMode, brushAmount, brushRadius];

	geometryComm();
}

/**
 * 3DS 레이어 불러오기
 * 매게변수 
 * layerTTName: layerName
 * 변수 세팅
 * layerTName: terrain 용 페이어 명 및 :EnvDataSetName: 다운 받는 폴더 설정
 * textureURL
 * layerPolygonMode: Both, Polygon, Outline
 * 호출
 * Init();
 * LayerTerrain();
 * CamFit();
 */
function geometryBound(){
	serviseName = "bound";

	geometryComm();
}

/**
 * 3DS 레이어 불러오기
 * 매게변수 
 * layerTTName: layerName
 * 변수 세팅
 * layerTName: terrain 용 페이어 명 및 :EnvDataSetName: 다운 받는 폴더 설정
 * textureURL
 * layerPolygonMode: Both, Polygon, Outline
 * 호출
 * Init();
 * LayerTerrain();
 * CamFit();
 */
function web3DDistance(){//가시권 분석	
	serviseName = "distance";
	var r, g, b, a, color;
	r = 30;
	g = 255;
	b = 30;
	a = 100;
	color = r + "^" + g + "^" + b + "^" + a;

	intraMap3D.length = 0;
	
//	intraMap3D = [sx, sy, sz, tx, ty, tz, gCnt, color];
	intraMap3D = [0, 0, 0, 0, 0, 0, 0, color];

	web3DComm();
}

/**
 * 3DS 레이어 불러오기
 * 매게변수 
 * layerTTName: layerName
 * 변수 세팅
 * layerTName: terrain 용 페이어 명 및 :EnvDataSetName: 다운 받는 폴더 설정
 * textureURL
 * layerPolygonMode: Both, Polygon, Outline
 * 호출
 * Init();
 * LayerTerrain();
 * CamFit();
 */
function web3DProspect(){//조망권 분석
	serviseName = "prospect";

	web3DComm();
}

/**
 * 3DS 레이어 불러오기
 * 매게변수 
 * layerTTName: layerName
 * 변수 세팅
 * layerTName: terrain 용 페이어 명 및 :EnvDataSetName: 다운 받는 폴더 설정
 * textureURL
 * layerPolygonMode: Both, Polygon, Outline
 * 호출
 * Init();
 * LayerTerrain();
 * CamFit();
 */
function web3DSunlight(){//일조권 분석
	serviseName = "sunlight";

	var sYe = document.getElementById('sYe').value;
	var sMo = document.getElementById('sMo').value;
	var sDa = document.getElementById('sDa').value;
	var sHo = document.getElementById('sHo').value;
	var sMi = document.getElementById('sMi').value;	

	var eHo = document.getElementById('eHo').value;
	var eMi = document.getElementById('eMi').value;
	
	var sunlighMode = document.getElementById('sunlighMode').value;
	var sunlighSpeed = document.getElementById('sunlighSpeed').value;

	intraMap3D.length = 0;	
	intraMap3D = [sYe, sMo, sDa, sHo, sMi, eHo, eMi, sunlighMode, sunlighSpeed];

	web3DComm();
}

function web3DSlope(){//평균경사도 분석
	serviseName = "slope";

	web3DComm();
}

function web3DFlood(){//침수 분석
	serviseName = "flood";
	var floodSpeed = document.getElementById('floodSpeed').value;
	var floodHeight = document.getElementById('floodHeight').value;

	var r, g, b, a, color;
	r = 0; 
	g = 51;
	b = 153;
	a = 220;
	color = r + "^" + g + "^" + b + "^" + a;
	
	intraMap3D.length = 0;	
	intraMap3D = [floodSpeed, floodHeight, color];

	web3DComm();
}

function web3DHeight(){//고도 분석
	serviseName = "height";
	
	var r, g, b, a, color;
	r = 255;
	g = 30;
	b = 30;
	a = 180;
	color = r + "^" + g + "^" + b + "^" + a;
	
	var height = document.getElementById('height').value;

	intraMap3D.length = 0;	
	intraMap3D = [height, color];

	web3DComm();
}

/******************************************************************************/
function layerComm(){//지형 올리기
	
	if( !terrainLoad && (serviseName!="terrain") ){
		alert("먼저 지형 테이터(itf)올리세요.");
		return 1;
	}
	
    zzz.LayerMake(intraMap3D[0], serviseName, intraMap3D[1]);
	if( serviseName=="terrain" ){//itf
		lightModeCont(); // 주간모드
	    zzz.CamSet("RotateMode", "On");
	    zzz.CamSetSlide(false);
	    
	    zzz.EnvFPSVisible(false);
	    
	    zzz.EnvDataSetName(intraMap3D[0]);//데이터의 다운받는 폴더이름을 설정한다.
	    
	    zzz.EnvSet("TerrainLevelfactor", "7");//TerrainLevelfactor 레벨 값
	    zzz.EnvSet("TerrainWebMapUpperLevel", "false");	    
	    
	    //zzz.DlgVisible("CameraUI", true);
	    zzz.DlgDock("CameraUI", 9);
	    
	    zzz.DlgSet("CameraUIScale", 0.5);	
	    zzz.DlgSet("indexmapscale", "1.0");
	    zzz.DlgSet("IndexMapPointerType", "Type1");
	    
	    //zzz.DlgURL("indexmap", "D://temp//temp_user//ksic//index.png");
		zzz.DlgPos("indexmap", 400, 400);
		
		zzz.DlgVisible("Skybox", true);
		zzz.DlgVisible("CameraUI", true);
		
		pageCommControl("terrain", intraMap3D[0]);//
		
		title="지형 테이터(itf)올리기 완료";		
	}else if( serviseName=="grid" ){
	    //option
	    zzz.LayerMaxDistance(intraMap3D[0], intraMap3D[2]);//maxdist 가시거리 설정 
	    zzz.LayerRscPath(intraMap3D[0], intraMap3D[3]);//rscPath 리소스 경로설정은 3ds파일 같은 외부파일을 포함하는 레이어 한해서 설정한다.
	}else if( serviseName=="Texture" ){//shp
		//셋중하나선택
		zzz.LayerPolygonMode(intraMap3D[0], intraMap3D[2]);
//		zzz.LayerOverlay(intraMap3D[0], true);
		
		zzz.LayerColor(intraMap3D[0], 255, 0, 0, 128); // 면컬러
		zzz.LayerColor2(intraMap3D[0], 255, 255, 0, 128); // 라인컬러
	}else if( serviseName=="scene" ){//3ds
   		zzz.LayerSceneLayerType(intraMap3D[0], intraMap3D[2], "");   
	}

//	alert(intraMap3D);
	zzz.LayerLoad(intraMap3D[0]);

	terrainLoad = true;
	
	
	( ( serviseName!="terrain" ) ? Init(pageType, false) : Init(pageType, true) );//초기화 세팅
	/*
	if( serviseName!="terrain" ){
		Init(pageType, false);//초기화 세팅
	}else{
		Init(pageType, true);//초기화 세팅
	}*/
}
/*
 * geometryId
 * geometryType: build,
 */
function geometryComm(){//지형 그리기
	
	if( !terrainLoad && (serviseName!="terrain") ){
		alert("먼저 지형 테이터(itf)올리세요.");
		return 1;
	}
	
	if( serviseName=="build" ){//geometryBuild
		/*마우스 이벤트*/
		mouseModeCont("DRAWPOINTS", "DRAWPOINTS", "Mode", "Polygon");//선 입력 모드
/*		var numFloor = 25; // 건물의층수
		var FloorHeight = 1.5; // 층의높이
		var tex = "";
		var re = layerName + "^" + numFloor + "^" + FloorHeight + "^" + tex;
		zzz.DrawBuilding("build", "pattern", re);*/
	}else if( serviseName=="road" ){//geometryRoad
		/*마우스 이벤트*/
		mouseModeCont("DRAWPOINTS", "DRAWPOINTS", "Mode", "Line");//선 입력 모드
	}else if( serviseName=="garo" ){//가로등 그리기
		mouseModeCont("PickPoint", "", "", "");//선 입력 모드
	}else if( serviseName=="brush" ){//가로등 그리기		
		mouseModeCont("TerrainBrush", "", "", "");//원 브러시 
		mouseModeCont("", "TerrainBrush", "AreaMode", intraMap3D[0]);//선 입력 모드
		mouseModeCont("", "TerrainBrush", "Amount", intraMap3D[1]);//높낮이 변화
		mouseModeCont("", "TerrainBrush", "Radius", intraMap3D[2]);//영역
	}else if( serviseName=="bound" ){//가로등 그리기
		zzz.TerrainEdit("", "Set", "TerrainBound", "", "0", "");
	}
	
	Init(pageType, false);//초기화 세팅
}



function web3DComm(){//3D 분석 기능
	
	if( !terrainLoad && (serviseName!="terrain") ){
		alert("먼저 지형 테이터(itf)올리세요.");
		return 1;
	}
	
	if(serviseName=="distance"){//가시권 분석
		intraMap3D[6] = 0;
		mouseModeCont("PickPoint", "", "", "");
		
		zzz.SetDrawInfo("color", intraMap3D[7]); // 색상설정

		zzz.AnalysisVisibilityInfo("Mode", "2DCalc");//2차원 모드
//		zzz.AnalysisVisibilityInfo("Mode", "3DView"); // 3차원 모드
		zzz.AnalysisVisibilityStart(intraMap3D[0], intraMap3D[1], intraMap3D[2], intraMap3D[3], intraMap3D[4], intraMap3D[5]);
	}else if(serviseName=="prospect"){//조망권
		mouseModeCont("PickPoint", "PickPoint", "PointMode", "Normal");		
	}else if(serviseName=="sunlight"){//일조권
		mouseModeCont("Pickobj", "", "", "");
	}else if(serviseName=="slope"){
		mouseModeCont("Drag", "", "", "");
	}else if(serviseName=="flood"){
		zzz.SetDrawInfo("color", intraMap3D[2]); // 색상 설정
		
		zzz.AnalysisFloodInfo("speed", intraMap3D[0]); // 속도 설정
		
		zzz.AnalysisFloodStart(intraMap3D[1]); // 높이 설정
		
		zzz.EnvSet("ComputeNearFar", "on"); // Z fighting 처리
	}else if(serviseName=="height"){
		zzz.SetDrawInfo("color", intraMap3D[1]); // 색상설정
		zzz.AnalysisAltitudeStart(intraMap3D[0]);
	}
	
	Init(pageType, false);//초기화 세팅
}

function mouseModeCont(op1, op2, op3, op4) {//마우스 모드 콘트롤
	if( op1  !="" ){
		pageCommControl("mouse", op1);//
		zzz.MouseMode(op1);
	}
	if( op2 !="" ){
		zzz.MouseModeOption(op2, op3, op4);
	}
	
}

function makelist(x) {//가로등 그리기
	( (rrr == "") ? (rrr = x) : (rrr = rrr + "^" + x) );
}
function makelist3(x, y, z) {//가로등 그리기
	( (rrr == "") ? (rrr = x + "^" + y + "^" + z) : (rrr = rrr + "^" + x + "^" + y + "^" + z) );
}

function sunlightStart(){//일조권 보기
	zzz.AnalysisSunlightInfo("Mode", intraMap3D[7]); // 일조권 모드
	zzz.AnalysisSunlightInfo("Speed", intraMap3D[8]); // 일조권 분석 속도
	zzz.AnalysisSunlightStart(intraMap3D[0], intraMap3D[1], intraMap3D[2], intraMap3D[3], intraMap3D[4], intraMap3D[0], intraMap3D[1], intraMap3D[2], intraMap3D[5], intraMap3D[6]);
}

/******************************************************************************/
function lightModeCont(){//주, 야간 모드	
	
	if( lightMode == "Night" ){
		lightMode = "terrain";
		document.getElementById("road").value = "주간 모드";
	}else{
		lightMode = "Night";
		document.getElementById("road").value = "야간 모드";
	}
	
	
	zzz.LightMode(lightMode,""); // 주간모드
}

function layerShowControl(){//visible 콘트롤
/*	var showType = true;
	if( checkLayer == "control" ){//control
		for( i=0; i<= showTypeArr.length; i++ ){
			if( showTypeArr==document.getElementById("layerTName").value ){
				showType = ShowTypeArr[0] = !ShowTypeArr[0];
			}else if( showTypeArr==document.getElementById("layerGName").value ){		
				showType = ShowTypeArr[1] = !ShowTypeArr[1];
			}
		}
		
		zzz.LayerVisible(showTypeArr, showType);
	}else{
		showTypeArr = document.getElementById(checkLayer).value;
		if( showTypeArr==document.getElementById("layerTName").value ){
			showType = ShowTypeArr[0];
		}else if( showTypeArr==document.getElementById("layerGName").value ){		
			showType = ShowTypeArr[1];
		}
	}
	document.getElementById('layerShow').value = showTypeArr+"Show:"+showType;*/
	
	var layerArr = document.getElementById("LayerShowSel").value.split(",");
	
	(( layerArr[2] == true || layerArr[2] == "true" ) ? layerArr[2] = false : layerArr[2] = true);
	
	
//	layerArr[2] = !layerArr[2];
	/*
	 * 배열에서 layerArr[1] 값이 같은 걸 찾아 layerArr[2] 값 수정 반영
	 */
	
	for( var i=0; i<showTypeArr.length; i++ ){//배열 값 세팅
		if( showTypeArr[i][1] == layerArr[1] ){
			showTypeArr[i][2] = layerArr[2];
			showN = i;
			break;
		}
	}
	
	
//	alert(layerArr[1]+", "+layerArr[2]);
	
	zzz.LayerVisible(layerArr[1], layerArr[2]);

	
	Init(pageType, false);//데이터 재 세팅
}

/******************************************************************************/
function Init(type, booMenu){//초기화 세팅 , booMenu: 왼쪽 버튼을 누를때만 true
	pageType = type;

	getTitle(title);
	getLeftMenu();//왼쪽 메뉴 로딩

	getTopMenu();//상단 로딩
	
	endComm();//기능 초기화		
	
	if( booMenu ){
		getInput();//상단 로딩
		getSubMenu();//상단 로딩
	}else{
		
	}
}

function endComm(){//종료
	if( oldServiseName != "" ){
		mouseModeCont("Camera", "Camera", "", "");
		mouseModeCont("", "PickPoint","PointMode","Point");//기본 상태로 돌림
	}
	
	
	if( oldServiseName == "Texture" ){
//		zzz.LayerOverlay(intraMap3D[0], false);
	}else if( oldServiseName == "bound" ){//평탄화
		zzz.TerrainEditClear();
	}else if ( oldServiseName == "distance" ){//가시권 분석
		zzz.AnalysisVisibilityEnd();
	}else if ( oldServiseName == "prospect" ){//조망권 분석
		zzz.AnalysisProspective("End","");
	}else if ( oldServiseName == "sunlight" ){//일조권 분석
		zzz.AnalysisSunlightEnd();
	}else if ( oldServiseName == "slope" ){//평균경사도 분석
		zzz.DlgVisible("ELEVATION", false);
	}else if ( oldServiseName == "flood" ){//침수 분석
		zzz.AnalysisFloodEnd();
		zzz.EnvSet("ComputeNearFar", "off");
	}else if ( oldServiseName == "height" ){//고도분석 분석
		zzz.AnalysisAltitudeEnd();
	}
	
	oldServiseName = serviseName;

}



function getTitle(value){//타이틀 변경
	document.title = value;
}


function showTypeAdd(type, name, value){
	
//	alert("showTypeAdd: "+type+", "+name+", "+value);
	
	for( var i=0, success = true, arrAddN=0; i<showTypeArr.length; i++ ){
		if( showTypeArr[i][1] == name ){
			success = false;
			arrAddN = i;
		}
	}
	
	( success ) ? (showTypeArr[showTypeArr.length] = [type, name, value]) : (showTypeArr[arrAddN] = [type, name, value]);
	
	/*if( success ){
		showTypeArr[showTypeArr.length] = [type, name, value];//name+"|"+value;	
	}else{
		showTypeArr[arrAddN] = [type, name, value];//name+"|"+value;
	}*/
	
}

function reload(){//F5 기능
//	location.reload();
	location.href("intraMap3D.jsp");
}

/******************************************************************************/
